package JZ_Offer.algorithm.other.数组;

/**
 * 输入一个长度为 n 整数数组，实现一个函数来调整该数组中数字的顺序，使得所有的奇数位于数组的前面部分，
 * 所有的偶数位于数组的后面部分，并保证奇数和奇数，偶数和偶数之间的相对位置不变。
 *
 * @Author piper
 * @Date 2019/11/21 1:59 下午
 */
public class JZ21_调整数组顺序使奇数位于偶数前面 {

    /**
     * 开辟新数组保存
     *
     * @param array
     */
    private static void reOrderArray(int[] array) {
        int[] array2 = new int[array.length];

        int i = 0, j = 0;
        for (int k = 0; k < array.length; k++) {
            int value = array[k];
            if (value % 2 == 0) {
                array2[j++] = value;
            } else {
                array[i++] = value;
            }
        }

        for (int l = 0; l < j; l++) {
            array[i++] = array2[l];
        }
    }

    /**
     * 遍历 找偶数
     * 遇到偶数 往后遍历找最近的一个奇数
     * 将奇数依次往前移动到偶数位置
     */
    private static void reOrderArray1(int[] array) {
        for (int i = 0; i < array.length; i++) {
            if (array[i] % 2 == 0) {
                for (int j = i + 1; j < array.length; j++) {
                    int temp = array[j];
                    if (temp % 2 != 0) {
                        while (j > i) {
                            array[j] = array[--j];
                        }
                        array[j] = temp;
                        break;
                    }
                }
            }
        }
    }

    /**
     * 依次交换 但是代码量少很多
     * 提前记录了一个有序点 就是有序奇数的大小
     * 遍历 找奇数
     * 往前交换到有序点 然后有序点+1
     */
    private static void reOrderArray2(int[] array) {
        int m = 0;
        for (int i = 0; i < array.length; i++) {
            // 奇数 往前移动
            int temp = array[i];
            if (temp % 2 != 0) {
                int j = i;
                while (j > m) {
                    array[j] = array[--j];
                }
                array[j] = temp;
                m++;
            }
        }
    }

    public static void main(String[] args) {
        int[] array = new int[]{2, 1, 3, 4, 5, 6, 7};
        reOrderArray2(array);
        for (int i : array) {
            System.out.println(i);
        }
    }
}